// 封装axios实例
// axios.get('xxx')
import { history } from '@/router'
import store from '@/store'
import { ApiRes } from '@/types/data'
import { RootAction } from '@/types/store'
import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
// import { useHistory } from 'react-router-dom'
import { getToken, removeToken, setToken } from './token'

const BASE_URL = 'http://toutiao.itheima.net/v1_0/'
// const BASE_URL = 'http://geek.itheima.net/v1_0/'

// 创建http实例
const http = axios.create({
  baseURL: BASE_URL,
  timeout: 5000,
})

// 添加请求拦截器
http.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const tokenObj = getToken()
    if (tokenObj.token) {
      config.headers!.Authorization = 'Bearer ' + tokenObj.token
    }

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
http.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError<ApiRes>) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // error.response?.data.message
    if (!error.response) {
      // 服务器崩了 响应没回来
      Toast.show('服务器繁忙，请稍后再试')
      return Promise.reject(error)
    }

    // 在这里实现token有问题的处理逻辑
    console.log(error, 999)
    if (error.response.status === 401) {
      // token有问题导致的请求失败

      // 判断到底有无token
      const tokenObj = getToken()
      if (tokenObj.token) {
        try {
          // token过期导致的 => 将来需要带着refresh_token换新的token
          // 1.换token是要发请求的!
          const res = await axios.put<ApiRes<{ token: string }>>(
            BASE_URL + 'authorizations',
            null,
            {
              headers: {
                Authorization: 'Bearer ' + tokenObj.refresh_token,
              },
            }
          )
          console.log('这是新的token', res)

          // 2.准备一个token对象 更新到仓库 本地
          const newTokenObj = {
            token: res.data.data.token,
            refresh_token: tokenObj.refresh_token,
          }

          setToken(newTokenObj)

          store.dispatch({
            type: 'login/login',
            payload: newTokenObj,
          } as RootAction)

          // http.get('/user',{})
          // http({
          //   method: 'get',
          //   url: '/user',
          //   // ...
          // })

          // error.config => 失败请求的所有配置
          // 3.必须重新发送失败的请求 做到无感
          return http(error.config)
        } catch (e) {
          // 换token失败  => 清空过期的token 去登录页登录

          removeToken()

          store.dispatch({
            type: 'login/login',
            payload: {},
          } as RootAction)

          history.push({
            pathname: '/login',
            state: {
              // 设置回跳地址
              from: history.location.pathname,
            },
          })
        }
      } else {
        // 没有token  没有登录 => 直接去登录页即可
        // const history = useHistory()
        history.push('/login')
      }
    }

    Toast.show(error.response.data.message)

    return Promise.reject(error)
  }
)

export default http
